package com.pubsys.main.client.paginas.insercao.view;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;
import com.pubsys.main.client.componentes.botao.ButtonClickEvent;
import com.pubsys.main.client.componentes.botao.ButtonWidget;
import com.pubsys.main.client.componentes.loading.Loading;
import com.pubsys.main.client.componentes.monografiafields.CamposMonografiaWidget;
import com.pubsys.main.client.componentes.referenciascellview.ReferenciaCellTableSelectEvent;
import com.pubsys.main.client.componentes.referenciascellview.ReferenciaCellView;
import com.pubsys.main.client.rpc.login.LoginService;
import com.pubsys.main.client.rpc.login.LoginServiceAsync;
import com.pubsys.main.client.rpc.referenciaservice.ReferenciaService;
import com.pubsys.main.client.rpc.referenciaservice.ReferenciaServiceAsync;
import com.pubsys.main.shared.model.Autor;
import com.pubsys.main.shared.model.FiltroReferencia;
import com.pubsys.main.shared.model.Monografia;
import com.pubsys.main.shared.model.Referencia;

public class InsercaoUI extends Composite {

	private static InsercaoUIUiBinder uiBinder = GWT.create(InsercaoUIUiBinder.class);
	@UiField(provided=true) ReferenciaCellView referenciaCellView = new ReferenciaCellView();
	@UiField TextBox tituloTextBox;
	@UiField TextBox autoresTextBox;
	@UiField TextBox localTextBox;
	@UiField TextBox editoraTextBox;
	@UiField DateBox anoDateBox;
	@UiField TextBox codTextBox;
	@UiField AbsolutePanel referenciaForm;
	@UiField Loading loading;
	@UiField ButtonWidget salvarBtn;
	@UiField ButtonWidget cancelarButton;
	@UiField ButtonWidget addBtn;
	@UiField ButtonWidget deleteBtn;
	@UiField ListBox tipoRefListBox;
	@UiField VerticalPanel painelForms;
	@UiField SimplePanel painelReferencias;
	@UiField Button button;
	private Autor autor;
	@UiField ButtonWidget buttonWidget;
	private Long idReferenciaAtual = null;
	private Referencia referenciaSelecionada = null;
	private CamposMonografiaWidget formMonografia;

	

	private static LoginServiceAsync loginService = GWT.create(LoginService.class);
	
	interface InsercaoUIUiBinder extends UiBinder<Widget, InsercaoUI> {
		
	}

	public InsercaoUI() {
		initWidget(uiBinder.createAndBindUi(this));
		this.anoDateBox.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
		
		loginService.pegaUsuarioLogado(new AsyncCallback<Autor>() {			
			@Override
			public void onSuccess(Autor result) {
				autor = result;
				if (autor == null || autor.getEmail().equals(""))
					Window.alert("Usuario não logado!");
				else{
					inicializaTiposRef();
					refreshReferencias();
				}
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao verificar usuário logado!");
			}
		});
		
	}
	
	private void inicializaTiposRef(){
		tipoRefListBox.addItem("PROCEEDING");
		tipoRefListBox.addItem("COLLENTION");
		tipoRefListBox.addItem("BOOK");
		tipoRefListBox.addItem("INPROCEEDING");
		
		tipoRefListBox.setSelectedIndex(0);
		formMonografia = new CamposMonografiaWidget(0);
		painelReferencias.add(formMonografia);
	}

	
	private void refreshReferencias() {
		FiltroReferencia filtro = new FiltroReferencia();
		filtro.addAutor(this.autor);
		ReferenciaServiceAsync referenciaService = GWT.create(ReferenciaService.class);
		referenciaService.getReferencias(filtro, new AsyncCallback<List<Referencia>>() {
			@Override
			public void onSuccess(List<Referencia> result) {
//				List<Referencia> refs = new LinkedList<Referencia>();
//				for (Referencia referencia : result) {
//					refs.add(referencia);
//				}
				if (result != null)
					referenciaCellView.setRowData(result);
				referenciaSelecionada = null;
			}
			
			@Override
			public void onFailure(Throwable caught) {
			}
		});
	}
	


	@UiHandler("referenciaCellView")
	void onReferenciaCellViewReferenciaSelect(ReferenciaCellTableSelectEvent event) {
		this.setReferenciaNoForm(event.getReferencia());
		this.referenciaSelecionada = event.getReferencia();
		this.referenciaForm.setVisible(true);
	}	
	
	
	
	private void setReferenciaNoForm(Referencia ref){
//		
//		this.idReferenciaAtual = null;
////		if (ref.getId() != null && ref.getId() > 0)
////			this.idReferenciaAtual = ref.getId();
//		
//		this.tituloTextBox.setText(ref.getTitulo());
//		String autores = "", virgula = "";
//		if (ref.getAutores() != null && ref.getAutores().size() > 0){
//			for (Autor autor : ref.getAutores()) {
//				autores += virgula + " " + autor.getNome();
//				virgula = ",";
//			}
//			this.autoresTextBox.setText(autores);
//		}
//		this.localTextBox.setText(ref.getLocal());
//		this.editoraTextBox.setText(ref.getEditora());
//		this.anoDateBox.setValue(ref.getDataPub());
//		this.codTextBox.setText(ref.getCodigo());
//		
		formMonografia.setReferencia(ref);
		
		
		this.painelForms.setVisible(true);
	}
	
	
	
	private Referencia getReferenciaDosCamposDoForm() {
		Referencia ref = new Referencia();
		
//		if (this.tituloTextBox.getText().trim().equals("")){
//			Window.alert("Favor inserir título válido");
//			this.tituloTextBox.setFocus(true);
//			return null;
//		}
//		ref.setTitulo(this.tituloTextBox.getText().trim());
//		if (this.autoresTextBox.getText().trim().equals("")){
//			Window.alert("Favor inserir ao menos um autor");
//			this.autoresTextBox.setFocus(true);
//			return null;
//		}
//		ref.setAutores(this.pegaAutoresDoForm());		
//		
//		if (this.localTextBox.getText().trim().equals("")){
//			Window.alert("Favor inserir local de publicação válido");
//			this.localTextBox.setFocus(true);
//			return null;
//		}
//		ref.setLocal(this.localTextBox.getText().trim());
//		
//		if (this.editoraTextBox.getText().trim().equals("")){
//			Window.alert("Favor inserir editora válida");
//			this.editoraTextBox.setFocus(true);
//			return null;
//		}
//		ref.setEditora(this.editoraTextBox.getText().trim());
//		if (this.anoDateBox.getTextBox().getText().trim().equals("") || this.anoDateBox.getValue() == null){
//			Window.alert("Favor inserir data válida");
//			this.anoDateBox.setFocus(true);
//			return null;
//		}
//		ref.setDataPub(this.anoDateBox.getValue());
//		if (this.codTextBox.getText().trim().equals("")){
//			Window.alert("Favor inserir código válido");
//			this.codTextBox.setFocus(true);
//			return null;
//		}
//		ref.setCodigo(this.codTextBox.getText().trim());
//		if (this.idReferenciaAtual != null)
//			ref.setId(this.idReferenciaAtual);
		return ref;
	}


	
	private ArrayList<Autor> pegaAutoresDoForm() {
		ArrayList<Autor> autores = new ArrayList<Autor>();
		String autoresNames[] = this.autoresTextBox.getText().split(",");
		for (String string : autoresNames) {
			Autor autor = new Autor(string.trim());
			autores.add(autor);
		}		
		return autores;
	}
	
	
	@UiHandler("salvarBtn")
	void onSalvarBtnClick(ButtonClickEvent event) {
		Referencia ref = this.getReferenciaDosCamposDoForm(); 
		if (ref == null)
			return;
			
		this.loading.setVisible(true);
		ReferenciaServiceAsync referenciaService = GWT.create(ReferenciaService.class);
		referenciaService.addReferencia(ref, new AsyncCallback<Void>() {			
			@Override
			public void onSuccess(Void result) {
				Window.alert("Inserido com sucesso!");
				loading.setVisible(false);
				referenciaForm.setVisible(false);
				refreshReferencias();				
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
				loading.setVisible(false);
			}
		});
	}
	@UiHandler("cancelarButton")
	void onCancelarButtonClick(ButtonClickEvent event) {
		this.referenciaForm.setVisible(false);
		this.referenciaCellView.cancelSelection();
	}
	@UiHandler("addBtn")
	void onAddBtnClick(ButtonClickEvent event) {
		this.setReferenciaNoForm(new Referencia());
	}
	@UiHandler("deleteBtn")
	void onDeleteBtnClick(ButtonClickEvent event) {
		if (this.referenciaSelecionada != null && Window.confirm("Certeza que deseja deletar?")){
			loading.setVisible(true);
			ReferenciaServiceAsync referenciaService = GWT.create(ReferenciaService.class);
			referenciaService.removeReferencia(this.referenciaSelecionada, new AsyncCallback<Void>() {
				@Override
				public void onSuccess(Void result) {
					refreshReferencias();
					loading.setVisible(false);
				}
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert(caught.getMessage());
					loading.setVisible(false);
				}
			});
		}
	}
	
	//salvar button
	@UiHandler("button")
	void onButtonClick(ClickEvent event) {
		int itemSelecionado = tipoRefListBox.getSelectedIndex();
		Referencia ref = null;
		
		switch(itemSelecionado){
		case 0: /* PROCEEDING */
		case 1: /* COLLENTION */
		case 2: /* BOOK */
				Monografia monog = formMonografia.getMonografia();
				if(monog == null) return;
				else ref = new Referencia(monog);
				break;
		}
		
		this.addReferenciaBancoDados(ref);
		
	}

	//cancelar button
	@UiHandler("buttonWidget")
	void onButtonWidgetClick(ButtonClickEvent event) {
		this.painelForms.setVisible(false);
	}
	
	
	private void addReferenciaBancoDados(Referencia ref){
		ReferenciaServiceAsync referenciaService = GWT.create(ReferenciaService.class);
		referenciaService.addReferencia(ref, new AsyncCallback<Void>() {			
			@Override
			public void onSuccess(Void result) {
				Window.alert("Inserido com sucesso!");
				loading.setVisible(false);
				painelForms.setVisible(false);
				refreshReferencias();				
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
				loading.setVisible(false);
			}
		});
	}
}
